package leetcode.cn;

/**
 * @version 1.8
 * @Author Djx_hmbb
 * @Date 2023/10/22 19:33
 * @注释:11.盛最多水的容器
 */
public class GetMaxWater {
    /*
    给定一个长度为 n 的整数数组 height 。有 n 条垂线，第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线，使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明：你不能倾斜容器。

示例 1：
输入：[1,8,6,2,5,4,8,3,7]
输出：49
解释：图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下，容器能够容纳水（表示为蓝色部分）的最大值为 49。

示例 2：
输入：height = [1,1]
输出：1
*/

//解法一：暴力枚举--超时
//解法二：根据单调性，利用双指针--最优解
    public static  int maxArea1(int[] height) {
        //两个指针：左指针，右指针
        int left = 0;
        int right = height.length-1;
        int vMax = 0;//最大体积
        int lon = 0;//最短高度
        while (left < right) {
            //比较左右指针 指向的数组高度 哪一个最短，取最短的
            if(height[right] >= height[left]){
                lon = height[left];
            }else lon = height[right];
            //先计算一次体积，移动一个指针,比较最大体积
            int v = (right - left)*lon;
            //移动最短的指针
            if(height[right] >= height[left]){
                left++;
            }else right--;
            //比较最大体积
            if(v > vMax) vMax = v;
        }
        return vMax;
    }

    //代码优化
    public static  int maxArea(int[] height) {
        //两个指针：左指针，右指针
        int left = 0;
        int right = height.length-1;
        int vMax = 0;//最大体积
        while (left < right) {
            //比较左右指针指向的数组高度 哪一个最短，取最短的--用数学函数
            //先计算一次体积，比较最大体积
            int v = (right - left)*Math.min(height[right],height[left]);
            vMax = Math.max(v,vMax);
            //移动一个指针,移动最短的指针。
            if(height[right] >= height[left]){
                left++;
            }else right--;
        }
        return vMax;
    }

    public static void main(String[] args) {
        int[] height = {1,8,6,2,5,4,8,3,7};
        int i = maxArea(height);
        System.out.println(i);
    }

}
